﻿using System.Collections.Generic;
using NHibernate;
using NHibernate.Criterion;
using Neturion.Dados;
using Neturion.IRepositorios;

namespace Neturion.Repositorios
{
    public class RepositorioNeturionLog : IRepositorioNeturionLog
    {
        public NeturionLog Inserir(NeturionLog neturionLog)
        {
            neturionLog.DataAlteracao = neturionLog.DataAlteracao.HasValue
                                         ? neturionLog.DataAlteracao.GetValueOrDefault().Date
                                         : neturionLog.DataAlteracao;

            GerenciadorBDConfigs.Instance.SessaoAtual().Save(neturionLog);
            return neturionLog;
        }

        public NeturionLog Atualizar(NeturionLog neturionLog)
        {
            NeturionLog tmpNeturionLog = ObterPorId(neturionLog.NeturionLogId);
            // Atribuicao dos valores do objeto da memoria para o objeto obtido no banco de dados
            tmpNeturionLog.DataAlteracao = neturionLog.DataAlteracao.HasValue
                                          ? neturionLog.DataAlteracao.GetValueOrDefault().Date
                                          : neturionLog.DataAlteracao;
            tmpNeturionLog.DataRegistro = neturionLog.DataRegistro;
            tmpNeturionLog.Objeto = neturionLog.Objeto;
            tmpNeturionLog.Usuario = neturionLog.Usuario;
            tmpNeturionLog.ValorAnterior = neturionLog.ValorAnterior;
            tmpNeturionLog.ValorAtual = neturionLog.ValorAtual;

            GerenciadorBDConfigs.Instance.SessaoAtual().Merge(tmpNeturionLog);
            return tmpNeturionLog;
        }

        public void Excluir(NeturionLog neturionLog)
        {
            GerenciadorBDConfigs.Instance.SessaoAtual().Delete(neturionLog);
        }

        public IList<NeturionLog> ObterTodos()
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof(NeturionLog));
            return criteria.List<NeturionLog>() as List<NeturionLog>;
        }

        public NeturionLog ObterPorId(int id)
        {
            return GerenciadorBDConfigs.Instance.SessaoAtual().Get<NeturionLog>(id);
        }

        public IList<NeturionLog> ObterPorUsuario(Usuario usuario)
        {
            ICriteria criteria = GerenciadorBDConfigs.Instance.SessaoAtual().CreateCriteria(typeof (NeturionLog))
                .Add(Restrictions.Eq("Usuario", usuario));
            return criteria.List<NeturionLog>() as List<NeturionLog>;
        }
    }
}